package com.dyj.tiktok;

import com.dyj.common.client.BaseClient;
import com.dyj.common.config.AgentConfiguration;
import com.dyj.common.config.DyConfiguration;
import com.dyj.common.domain.*;
import com.dyj.common.domain.vo.*;
import com.dyj.common.utils.DyConfigUtils;
import com.dyj.tiktok.domain.vo.*;
import com.dyj.tiktok.handler.AccessTokenHandler;
import com.dyj.tiktok.handler.UserHandler;
import com.dyj.tiktok.handler.VideoHandler;
import org.apache.commons.codec.digest.DigestUtils;

import java.io.File;
import java.io.InputStream;
import java.util.List;

/**
 * @author danmo
 * @date 2024-04-03 17:25
 **/
public class DyTiktokClient extends BaseClient {

    public DyTiktokClient() {
    }

    public static DyTiktokClient getInstance() {
        return new DyTiktokClient();
    }

    public DyTiktokClient tenantId(Integer tenantId) {
        super.tenantId = tenantId;
        return this;
    }

    public DyTiktokClient clientKey(String clientKey) {
        this.clientKey = clientKey;
        return this;
    }

    private final String AUTHORIZE_URL = "https://www.tiktok.com/v2/auth/authorize";

    public String getPreAuthUrl(String redirectUri,String scope){
        List<AgentConfiguration> agents = DyConfigUtils.getAgents();
        String clientKey = agents.get(0).getClientKey();
        return AUTHORIZE_URL + "?client_key=" + clientKey +
                "&redirect_uri=" + redirectUri +
                "&scope=" + scope +
                "&response_type=code" +
                "&state="+ DigestUtils.md5Hex(redirectUri);
    }

    /**
     * 回调事件签名验证
     *
     * @param signature 签名
     * @param wholeStr  消息体字符串
     * @return 验证结果
     */
    public Boolean checkSign(String signature, String wholeStr) {
        AgentConfiguration agentConfiguration = configuration().getAgentConfigService().loadAgentByTenantId(tenantId, clientKey);
        String data = agentConfiguration.getClientSecret() + wholeStr;
        String sign = DigestUtils.sha1Hex(data);
        if (!sign.equals(signature)) {
            return false;
        }
        return true;
    }

    /**
     * 通过代码获取访问令牌。
     *
     * @param code 用户授权后返回的授权码。
     * @return 返回一个包含访问令牌信息的结果对象。
     */
    public AccessTikTokTokenVo accessToken(String code, String redirect_uri) {
        AgentConfiguration agentConfiguration = configuration().getAgentConfigService().loadAgentByTenantId(tenantId, clientKey);
        // 使用配置信息和授权码获取访问令牌
        return new AccessTokenHandler(agentConfiguration).getAccessToken(code, redirect_uri);
    }

    /**
     * 刷新访问令牌。
     * 本方法用于根据租户ID和应用ID获取新的访问令牌。
     *
     * @return 返回一个包含刷新后的访问令牌信息的结果对象。
     */
    public AccessTikTokTokenVo refreshToken(String openId) {
        DyConfiguration configuration = configuration();
        AgentConfiguration agentConfiguration = configuration.getAgentConfigService().loadAgentByTenantId(tenantId, clientKey);
        UserTokenInfo userTokenInfo = configuration.getAgentTokenService().getUserTokenInfo(agentConfiguration.getTenantId(), agentConfiguration.getClientKey(), openId);
        // 利用配置信息和授权码获取新的访问令牌
        return new AccessTokenHandler(agentConfiguration).refreshToken(userTokenInfo.getRefreshToken(), openId);
    }

    /**
     * 获取用户信息的函数，支持指定租户ID和客户端ID。
     *
     * @param openId 用户的唯一标识。
     * @return 返回一个包含用户信息的DyResult对象。
     */
    public DyTikTokResult<TikTokInfoVo> getUserInfo(String openId) {
        // 根据配置获取Agent配置
        DyConfiguration configuration = configuration();
        AgentConfiguration agentConfiguration = configuration.getAgentConfigService().loadAgentByTenantId(tenantId, clientKey);
        // 使用Agent配置和用户ID获取用户信息
        return new UserHandler(agentConfiguration).getUserInfo(openId);
    }

    /**
     * 查询授权账号视频列表。
     *
     * @param openId 用户ID。
     * @param cursor 分页游标。
     * @param count  每页数量。
     * @return DyResult<QueryVideoListVo>。
     */
    public DyTikTokResult<QueryVideoListVo> queryVideoList(String openId, Long cursor, Integer count) {
        return new VideoHandler(configuration().getAgentConfigService().loadAgentByTenantId(tenantId, clientKey)).queryVideoList(openId, cursor, count);
    }

    /**
     * 初始化上传视频
     */
    public DyTikTokResult<InitUploadVideoRespVo> initUploadVideo(String openId, InitUploadVideoReqVo initUploadVideoReqVo) {
        return new VideoHandler(configuration().getAgentConfigService().loadAgentByTenantId(tenantId, clientKey)).initUploadVideo(openId, initUploadVideoReqVo);
    }

    /**
     * 分片上传草稿箱
     */
    public Boolean uploadVideo(String upload_url, InputStream fileInputStream, Long fileSize) {
        return new VideoHandler(configuration().getAgentConfigService().loadAgentByTenantId(tenantId, clientKey)).uploadVideo(upload_url, fileInputStream, fileSize);
    }

    /**
     * 上传图片
     */
    public DyTikTokResult<UploadImageRespVo> uploadImage(String openId, UploadImageReqVo uploadImageReqVo) {
        return new VideoHandler(configuration().getAgentConfigService().loadAgentByTenantId(tenantId, clientKey)).uploadImage(openId, uploadImageReqVo);
    }

    /**
     * 查询上传进度
     */
    public DyTikTokResult<QueryPostStatusRespVo> queryPostStatus(String openId, String publishId){
        return new VideoHandler(configuration().getAgentConfigService().loadAgentByTenantId(tenantId, clientKey)).queryPostStatus(openId, publishId);
    }

}
